XDG基本目录规范

XDG基本目录规范

定义

一个规范,用来指定文件和文件格式,文件位置

规范内容

有一个相对于用户特定的数据文件应该写入的基本目录。该目录由环境变量定义$XDG_DATA_HOME。

有一个基本目录相对应用户特定的配置文件应该写入。该目录由环境变量定义$XDG_CONFIG_HOME。

有一组偏好的基本目录,相对于其中的数据文件应该被搜索。这组目录由环境变量定义$XDG_DATA_DIRS。

有一组首选的基本目录相对于哪些配置文件应该被搜索。这组目录由环境变量定义$XDG_CONFIG_DIRS。

有一个单独的基本目录,用户特定的非必要(缓存)数据应该写入其中。该目录由环境变量定义$XDG_CACHE_HOME。

有一个单独的基本目录,用户特定的运行时文件和其他文件对象应放置在该目录中。该目录由环境变量定义$XDG_RUNTIME_DIR。

laravel中xdg的实现代码,(env文件可以定义路径)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
class Xdg
{
const S_IFDIR = 040000; // directory
const S_IRWXO = 00007; // rwx other
const S_IRWXG = 00056; // rwx group
const RUNTIME_DIR_FALLBACK = 'php-xdg-runtime-dir-fallback-';

/**
* @return string
*/
public function getHomeDir()
{
return getenv('HOME') ?: (getenv('HOMEDRIVE') . DIRECTORY_SEPARATOR . getenv('HOMEPATH'));
}

/**
* @return string
*/
public function getHomeConfigDir()
{
$path = getenv('XDG_CONFIG_HOME') ?: $this->getHomeDir() . DIRECTORY_SEPARATOR . '.config';

return $path;
}

/**
* @return string
*/
public function getHomeDataDir()
{
$path = getenv('XDG_DATA_HOME') ?: $this->getHomeDir() . DIRECTORY_SEPARATOR . '.local' . DIRECTORY_SEPARATOR . 'share';

return $path;
}

/**
* @return array
*/
public function getConfigDirs()
{
$configDirs = getenv('XDG_CONFIG_DIRS') ? explode(':', getenv('XDG_CONFIG_DIRS')) : array('/etc/xdg');

$paths = array_merge(array($this->getHomeConfigDir()), $configDirs);

return $paths;
}

/**
* @return array
*/
public function getDataDirs()
{
$dataDirs = getenv('XDG_DATA_DIRS') ? explode(':', getenv('XDG_DATA_DIRS')) : array('/usr/local/share', '/usr/share');

$paths = array_merge(array($this->getHomeDataDir()), $dataDirs);

return $paths;
}

/**
* @return string
*/
public function getHomeCacheDir()
{
$path = getenv('XDG_CACHE_HOME') ?: $this->getHomeDir() . DIRECTORY_SEPARATOR . '.cache';

return $path;

}

public function getRuntimeDir($strict=true)
{
if ($runtimeDir = getenv('XDG_RUNTIME_DIR')) {
return $runtimeDir;
}

if ($strict) {
throw new \RuntimeException('XDG_RUNTIME_DIR was not set');
}

$fallback = sys_get_temp_dir() . DIRECTORY_SEPARATOR . self::RUNTIME_DIR_FALLBACK . getenv('USER');

$create = false;

if (!is_dir($fallback)) {
mkdir($fallback, 0700, true);
}

$st = lstat($fallback);

# The fallback must be a directory
if (!$st['mode'] & self::S_IFDIR) {
rmdir($fallback);
$create = true;
} elseif ($st['uid'] != getmyuid() ||
$st['mode'] & (self::S_IRWXG | self::S_IRWXO)
) {
rmdir($fallback);
$create = true;
}

if ($create) {
mkdir($fallback, 0700, true);
}

return $fallback;
}

}

参考 https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html